From: Bryan Davis Date: Thu, 2 Jul 2015 22:38:06 +0000 (-0600) Subject: MonologSpi: Add method to provide additional configuration X-Git-Tag: 1.31.0-rc.0~10758^2 X-Git-Url: http://git.cyclocoop.org/%7D%7Cconcat%7B?a=commitdiff_plain;h=3a577ce8f056d0e52668c9ba9340f88cada06b84;p=lhc%2Fweb%2Fwiklou.git MonologSpi: Add method to provide additional configuration Allow post-initialization configuration of MonologSpi by providing a `mergeConfig()` method that can be used to merge a given collection of configuration data with the existing configuration. Bug: T104584 Change-Id: Iba6f115a79dbc0060f64a9095467d147cf53b8ae --- diff --git a/includes/debug/logger/MonologSpi.php b/includes/debug/logger/MonologSpi.php index a07fdc4a8b..e32e0b2263 100644 --- a/includes/debug/logger/MonologSpi.php +++ b/includes/debug/logger/MonologSpi.php @@ -129,7 +129,25 @@ class MonologSpi implements Spi { * @param array $config Configuration data. */ public function __construct( array $config ) { - $this->config = $config; + $this->config = array(); + $this->mergeConfig( $config ); + } + + + /** + * Merge additional configuration data into the configuration. + * + * @since 1.26 + * @param array $config Configuration data. + */ + public function mergeConfig( array $config ) { + foreach ( $config as $key => $value ) { + if ( isset( $this->config[$key] ) ) { + $this->config[$key] = array_merge( $this->config[$key], $value ); + } else { + $this->config[$key] = $value; + } + } $this->reset(); } diff --git a/tests/phpunit/includes/debug/logger/LegacyLoggerTest.php b/tests/phpunit/includes/debug/logger/LegacyLoggerTest.php new file mode 100644 index 0000000000..415fa0451b --- /dev/null +++ b/tests/phpunit/includes/debug/logger/LegacyLoggerTest.php @@ -0,0 +1,122 @@ +assertEquals( + $expect, LegacyLogger::interpolate( $message, $context ) ); + } + + public function provideInterpolate() { + return array( + array( + 'no-op', + array(), + 'no-op', + ), + array( + 'Hello {world}!', + array( + 'world' => 'World', + ), + 'Hello World!', + ), + array( + '{greeting} {user}', + array( + 'greeting' => 'Goodnight', + 'user' => 'Moon', + ), + 'Goodnight Moon', + ), + array( + 'Oops {key_not_set}', + array(), + 'Oops {key_not_set}', + ), + array( + '{ not interpolated }', + array( + 'not interpolated' => 'This should NOT show up in the message', + ), + '{ not interpolated }', + ), + ); + } + + /** + * @covers LegacyLogger::shouldEmit + * @dataProvider provideShouldEmit + */ + public function testShouldEmit( $level, $config, $expected ) { + $this->setMwGlobals( 'wgDebugLogGroups', array( 'fakechannel' => $config ) ); + $this->assertEquals( + $expected, + LegacyLogger::shouldEmit( 'fakechannel', 'some message', $level, array() ) + ); + } + + public static function provideShouldEmit() { + $dest = array( 'destination' => 'foobar' ); + $tests = array( + array( + LogLevel::DEBUG, + $dest, + true + ), + array( + LogLevel::WARNING, + $dest + array( 'level' => LogLevel::INFO ), + true, + ), + array( + LogLevel::INFO, + $dest + array( 'level' => LogLevel::CRITICAL ), + false, + ), + ); + + if ( class_exists( '\Monolog\Logger' ) ) { + $tests[] = array( + \Monolog\Logger::INFO, + $dest + array( 'level' => LogLevel::INFO ), + true, + ); + $tests[] = array( + \Monolog\Logger::WARNING, + $dest + array( 'level' => LogLevel::EMERGENCY ), + false, + ); + } + + return $tests; + } + +} diff --git a/tests/phpunit/includes/debug/logger/MonologSpiTest.php b/tests/phpunit/includes/debug/logger/MonologSpiTest.php new file mode 100644 index 0000000000..aa0a54ffd6 --- /dev/null +++ b/tests/phpunit/includes/debug/logger/MonologSpiTest.php @@ -0,0 +1,136 @@ + array( + '@default' => array( + 'processors' => array( 'constructor' ), + 'handlers' => array( 'constructor' ), + ), + ), + 'processors' => array( + 'constructor' => array( + 'class' => 'constructor', + ), + ), + 'handlers' => array( + 'constructor' => array( + 'class' => 'constructor', + 'formatter' => 'constructor', + ), + ), + 'formatters' => array( + 'constructor' => array( + 'class' => 'constructor', + ), + ), + ); + + $fixture = new MonologSpi( $base ); + $this->assertSame( + $base, + TestingAccessWrapper::newFromObject( $fixture )->config + ); + + $fixture->mergeConfig( array( + 'loggers' => array( + 'merged' => array( + 'processors' => array( 'merged' ), + 'handlers' => array( 'merged' ), + ), + ), + 'processors' => array( + 'merged' => array( + 'class' => 'merged', + ), + ), + 'magic' => array( + 'idkfa' => array( 'xyzzy' ), + ), + 'handlers' => array( + 'merged' => array( + 'class' => 'merged', + 'formatter' => 'merged', + ), + ), + 'formatters' => array( + 'merged' => array( + 'class' => 'merged', + ), + ), + ) ); + $this->assertSame( + array( + 'loggers' => array( + '@default' => array( + 'processors' => array( 'constructor' ), + 'handlers' => array( 'constructor' ), + ), + 'merged' => array( + 'processors' => array( 'merged' ), + 'handlers' => array( 'merged' ), + ), + ), + 'processors' => array( + 'constructor' => array( + 'class' => 'constructor', + ), + 'merged' => array( + 'class' => 'merged', + ), + ), + 'handlers' => array( + 'constructor' => array( + 'class' => 'constructor', + 'formatter' => 'constructor', + ), + 'merged' => array( + 'class' => 'merged', + 'formatter' => 'merged', + ), + ), + 'formatters' => array( + 'constructor' => array( + 'class' => 'constructor', + ), + 'merged' => array( + 'class' => 'merged', + ), + ), + 'magic' => array( + 'idkfa' => array( 'xyzzy' ), + ), + ), + TestingAccessWrapper::newFromObject( $fixture )->config + ); + } + +} diff --git a/tests/phpunit/includes/debug/logging/LegacyLoggerTest.php b/tests/phpunit/includes/debug/logging/LegacyLoggerTest.php deleted file mode 100644 index 415fa0451b..0000000000 --- a/tests/phpunit/includes/debug/logging/LegacyLoggerTest.php +++ /dev/null @@ -1,122 +0,0 @@ -assertEquals( - $expect, LegacyLogger::interpolate( $message, $context ) ); - } - - public function provideInterpolate() { - return array( - array( - 'no-op', - array(), - 'no-op', - ), - array( - 'Hello {world}!', - array( - 'world' => 'World', - ), - 'Hello World!', - ), - array( - '{greeting} {user}', - array( - 'greeting' => 'Goodnight', - 'user' => 'Moon', - ), - 'Goodnight Moon', - ), - array( - 'Oops {key_not_set}', - array(), - 'Oops {key_not_set}', - ), - array( - '{ not interpolated }', - array( - 'not interpolated' => 'This should NOT show up in the message', - ), - '{ not interpolated }', - ), - ); - } - - /** - * @covers LegacyLogger::shouldEmit - * @dataProvider provideShouldEmit - */ - public function testShouldEmit( $level, $config, $expected ) { - $this->setMwGlobals( 'wgDebugLogGroups', array( 'fakechannel' => $config ) ); - $this->assertEquals( - $expected, - LegacyLogger::shouldEmit( 'fakechannel', 'some message', $level, array() ) - ); - } - - public static function provideShouldEmit() { - $dest = array( 'destination' => 'foobar' ); - $tests = array( - array( - LogLevel::DEBUG, - $dest, - true - ), - array( - LogLevel::WARNING, - $dest + array( 'level' => LogLevel::INFO ), - true, - ), - array( - LogLevel::INFO, - $dest + array( 'level' => LogLevel::CRITICAL ), - false, - ), - ); - - if ( class_exists( '\Monolog\Logger' ) ) { - $tests[] = array( - \Monolog\Logger::INFO, - $dest + array( 'level' => LogLevel::INFO ), - true, - ); - $tests[] = array( - \Monolog\Logger::WARNING, - $dest + array( 'level' => LogLevel::EMERGENCY ), - false, - ); - } - - return $tests; - } - -}